package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Modulo;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IModuloDAO;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author David y Aitor
 */
public class SQLServerModuloDAO implements IModuloDAO {

    private static ResourceBundle rb;

    public SQLServerModuloDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Metodo que crea una un modulo.
     * @author: Sara y Alvaro
     * @param Modulo: contiene los datos de un modulo
     * @return Devuelve
     */
    public int crearModulo(Modulo modulo) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        int id = -1;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            stmt = new SentenciaNula(con, "INSERT INTO Modulo (ModDescr, CurId, ModDuracion)VALUES (?,?,?)", Statement.RETURN_GENERATED_KEYS);
            stmt.setString(1, modulo.getModDescr());
            stmt.setInt(2, modulo.getCurId());
            stmt.setInt(3, modulo.getModDuracion());
            stmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));

        } finally {
            SQLServerDAOFactory.desconecta(con);
        }

        return id;
    }

    /**
     * Metod que crea una instacia de un modulo.
     * @author
     * @param rs: result set de la consulta a la tabla de modulos
     * @return Devuelve un modulo
     */
    public Modulo instanciarModulo(ResultSet rs) throws SQLException {
        Modulo modulo = new Modulo();
        modulo.setModId(rs.getInt("ModId"));
        modulo.setModDescr(rs.getString("ModDescr"));
        modulo.setCurId(rs.getInt("CurId"));
        modulo.setModDuracion(rs.getInt("ModDuracion"));

        return modulo;
    }

    /**
     * Metodo que lista los módulos de un curso.
     * @param curso: Contiene los datos de un curso.
     * @return Una lista de modulos
     */
    public ArrayList<Modulo> listarModulos(Integer curso) throws GestorFormacionExcepcion {
        ArrayList<Modulo> modulos = new ArrayList<Modulo>();
        Modulo modulo;
        Connection conexion = null;
        String sql;

        sql = "SELECT ModId, ModDescr, CurId, ModDuracion FROM Modulo WHERE CurId=" + curso;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                modulo = instanciarModulo(rs);
                modulos.add(modulo);
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return modulos;
    }

    /**
     * Metodo que suma las horas de todos los modulos de un curso
     * @author
     * @param curso: Identificador de un curso
     * @return La suma de las horas de los modulos del curso.
     * @throws GestorFormacionExcepcion
     */
    public int cuentaHorasModulos(int idCurso) throws GestorFormacionExcepcion {
        Connection conexion = null;
        int total = 0;
        String sql;
        sql = "SELECT SUM(ModDuracion) as DurTotal FROM Modulo WHERE CurId=" + idCurso;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                total = rs.getInt("DurTotal");
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return total;
    }

    /**
     * Metodo que borra un modulo y su bibliografia asociada
     * @author
     * @param modId: Identificador del modulo que pasamos
     * @throws GestorFormacionExcepcion
     */
    public void eliminarModulo(int modId) throws GestorFormacionExcepcion {
        Connection con = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            con.setAutoCommit(false);
            PreparedStatement stmt;
            //BORRAMOS la bibliografia del modulo
            stmt = con.prepareStatement("DELETE FROM Bibliografia WHERE ModId=" + modId);
            stmt.executeUpdate();
            // Desasignamos el módulo al calendario para poder borrarlo.
            stmt = con.prepareStatement("UPDATE Clase SET ModId=NULL WHERE ModId=" + modId);
            stmt.executeUpdate();
            //BORRAMOS la informacion del modulo
            stmt = con.prepareStatement("DELETE FROM Modulo WHERE ModId=" + modId);
            stmt.executeUpdate();
            con.commit();
            stmt.close();
        } catch (SQLException ex) {
            try {
                con.rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex1);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
            Logger.getLogger(SQLServerModuloDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }
}
